home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / time.h < prev    next >
Encoding:
C/C++ Source or Header  |  2009-09-09  |  6.6 KB  |  244 lines

  1. #ifndef _LINUX_TIME_H
  2. #define _LINUX_TIME_H
  3.  
  4. #include <linux/types.h>
  5.  
  6. #ifdef __KERNEL__
  7. # include <linux/cache.h>
  8. # include <linux/seqlock.h>
  9. # include <linux/math64.h>
  10. #endif
  11.  
  12. #ifndef _STRUCT_TIMESPEC
  13. #define _STRUCT_TIMESPEC
  14. struct timespec {
  15.     time_t    tv_sec;        /* seconds */
  16.     long    tv_nsec;    /* nanoseconds */
  17. };
  18. #endif
  19.  
  20. struct timeval {
  21.     time_t        tv_sec;        /* seconds */
  22.     suseconds_t    tv_usec;    /* microseconds */
  23. };
  24.  
  25. struct timezone {
  26.     int    tz_minuteswest;    /* minutes west of Greenwich */
  27.     int    tz_dsttime;    /* type of dst correction */
  28. };
  29.  
  30. #ifdef __KERNEL__
  31.  
  32. extern struct timezone sys_tz;
  33.  
  34. /* Parameters used to convert the timespec values: */
  35. #define MSEC_PER_SEC    1000L
  36. #define USEC_PER_MSEC    1000L
  37. #define NSEC_PER_USEC    1000L
  38. #define NSEC_PER_MSEC    1000000L
  39. #define USEC_PER_SEC    1000000L
  40. #define NSEC_PER_SEC    1000000000L
  41. #define FSEC_PER_SEC    1000000000000000L
  42.  
  43. #define TIME_T_MAX    (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
  44.  
  45. static inline int timespec_equal(const struct timespec *a,
  46.                                  const struct timespec *b)
  47. {
  48.     return (a->tv_sec == b->tv_sec) && (a->tv_nsec == b->tv_nsec);
  49. }
  50.  
  51. /*
  52.  * lhs < rhs:  return <0
  53.  * lhs == rhs: return 0
  54.  * lhs > rhs:  return >0
  55.  */
  56. static inline int timespec_compare(const struct timespec *lhs, const struct timespec *rhs)
  57. {
  58.     if (lhs->tv_sec < rhs->tv_sec)
  59.         return -1;
  60.     if (lhs->tv_sec > rhs->tv_sec)
  61.         return 1;
  62.     return lhs->tv_nsec - rhs->tv_nsec;
  63. }
  64.  
  65. static inline int timeval_compare(const struct timeval *lhs, const struct timeval *rhs)
  66. {
  67.     if (lhs->tv_sec < rhs->tv_sec)
  68.         return -1;
  69.     if (lhs->tv_sec > rhs->tv_sec)
  70.         return 1;
  71.     return lhs->tv_usec - rhs->tv_usec;
  72. }
  73.  
  74. extern unsigned long mktime(const unsigned int year, const unsigned int mon,
  75.                 const unsigned int day, const unsigned int hour,
  76.                 const unsigned int min, const unsigned int sec);
  77.  
  78. extern void set_normalized_timespec(struct timespec *ts, time_t sec, long nsec);
  79. extern struct timespec timespec_add_safe(const struct timespec lhs,
  80.                      const struct timespec rhs);
  81.  
  82. /*
  83.  * sub = lhs - rhs, in normalized form
  84.  */
  85. static inline struct timespec timespec_sub(struct timespec lhs,
  86.                         struct timespec rhs)
  87. {
  88.     struct timespec ts_delta;
  89.     set_normalized_timespec(&ts_delta, lhs.tv_sec - rhs.tv_sec,
  90.                 lhs.tv_nsec - rhs.tv_nsec);
  91.     return ts_delta;
  92. }
  93.  
  94. /*
  95.  * Returns true if the timespec is norm, false if denorm:
  96.  */
  97. #define timespec_valid(ts) \
  98.     (((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC))
  99.  
  100. extern struct timespec xtime;
  101. extern struct timespec wall_to_monotonic;
  102. extern seqlock_t xtime_lock;
  103.  
  104. extern unsigned long read_persistent_clock(void);
  105. extern int update_persistent_clock(struct timespec now);
  106. extern int no_sync_cmos_clock __read_mostly;
  107. void timekeeping_init(void);
  108. extern int timekeeping_suspended;
  109.  
  110. unsigned long get_seconds(void);
  111. struct timespec current_kernel_time(void);
  112.  
  113. #define CURRENT_TIME        (current_kernel_time())
  114. #define CURRENT_TIME_SEC    ((struct timespec) { get_seconds(), 0 })
  115.  
  116. extern void do_gettimeofday(struct timeval *tv);
  117. extern int do_settimeofday(struct timespec *tv);
  118. extern int do_sys_settimeofday(struct timespec *tv, struct timezone *tz);
  119. #define do_posix_clock_monotonic_gettime(ts) ktime_get_ts(ts)
  120. extern long do_utimes(int dfd, char __user *filename, struct timespec *times, int flags);
  121. struct itimerval;
  122. extern int do_setitimer(int which, struct itimerval *value,
  123.             struct itimerval *ovalue);
  124. extern unsigned int alarm_setitimer(unsigned int seconds);
  125. extern int do_getitimer(int which, struct itimerval *value);
  126. extern void getnstimeofday(struct timespec *tv);
  127. extern void getrawmonotonic(struct timespec *ts);
  128. extern void getboottime(struct timespec *ts);
  129. extern void monotonic_to_bootbased(struct timespec *ts);
  130.  
  131. extern struct timespec timespec_trunc(struct timespec t, unsigned gran);
  132. extern int timekeeping_valid_for_hres(void);
  133. extern void update_wall_time(void);
  134. extern void update_xtime_cache(u64 nsec);
  135.  
  136. struct tms;
  137. extern void do_sys_times(struct tms *);
  138.  
  139. /**
  140.  * timespec_to_ns - Convert timespec to nanoseconds
  141.  * @ts:        pointer to the timespec variable to be converted
  142.  *
  143.  * Returns the scalar nanosecond representation of the timespec
  144.  * parameter.
  145.  */
  146. static inline s64 timespec_to_ns(const struct timespec *ts)
  147. {
  148.     return ((s64) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec;
  149. }
  150.  
  151. /**
  152.  * timeval_to_ns - Convert timeval to nanoseconds
  153.  * @ts:        pointer to the timeval variable to be converted
  154.  *
  155.  * Returns the scalar nanosecond representation of the timeval
  156.  * parameter.
  157.  */
  158. static inline s64 timeval_to_ns(const struct timeval *tv)
  159. {
  160.     return ((s64) tv->tv_sec * NSEC_PER_SEC) +
  161.         tv->tv_usec * NSEC_PER_USEC;
  162. }
  163.  
  164. /**
  165.  * ns_to_timespec - Convert nanoseconds to timespec
  166.  * @nsec:    the nanoseconds value to be converted
  167.  *
  168.  * Returns the timespec representation of the nsec parameter.
  169.  */
  170. extern struct timespec ns_to_timespec(const s64 nsec);
  171.  
  172. /**
  173.  * ns_to_timeval - Convert nanoseconds to timeval
  174.  * @nsec:    the nanoseconds value to be converted
  175.  *
  176.  * Returns the timeval representation of the nsec parameter.
  177.  */
  178. extern struct timeval ns_to_timeval(const s64 nsec);
  179.  
  180. /**
  181.  * timespec_add_ns - Adds nanoseconds to a timespec
  182.  * @a:        pointer to timespec to be incremented
  183.  * @ns:        unsigned nanoseconds value to be added
  184.  *
  185.  * This must always be inlined because its used from the x86-64 vdso,
  186.  * which cannot call other kernel functions.
  187.  */
  188. static __always_inline void timespec_add_ns(struct timespec *a, u64 ns)
  189. {
  190.     a->tv_sec += __iter_div_u64_rem(a->tv_nsec + ns, NSEC_PER_SEC, &ns);
  191.     a->tv_nsec = ns;
  192. }
  193. #endif /* __KERNEL__ */
  194.  
  195. #define NFDBITS            __NFDBITS
  196.  
  197. #define FD_SETSIZE        __FD_SETSIZE
  198. #define FD_SET(fd,fdsetp)    __FD_SET(fd,fdsetp)
  199. #define FD_CLR(fd,fdsetp)    __FD_CLR(fd,fdsetp)
  200. #define FD_ISSET(fd,fdsetp)    __FD_ISSET(fd,fdsetp)
  201. #define FD_ZERO(fdsetp)        __FD_ZERO(fdsetp)
  202.  
  203. /*
  204.  * Names of the interval timers, and structure
  205.  * defining a timer setting:
  206.  */
  207. #define    ITIMER_REAL        0
  208. #define    ITIMER_VIRTUAL        1
  209. #define    ITIMER_PROF        2
  210.  
  211. struct itimerspec {
  212.     struct timespec it_interval;    /* timer period */
  213.     struct timespec it_value;    /* timer expiration */
  214. };
  215.  
  216. struct itimerval {
  217.     struct timeval it_interval;    /* timer interval */
  218.     struct timeval it_value;    /* current value */
  219. };
  220.  
  221. /*
  222.  * The IDs of the various system clocks (for POSIX.1b interval timers):
  223.  */
  224. #define CLOCK_REALTIME            0
  225. #define CLOCK_MONOTONIC            1
  226. #define CLOCK_PROCESS_CPUTIME_ID    2
  227. #define CLOCK_THREAD_CPUTIME_ID        3
  228. #define CLOCK_MONOTONIC_RAW        4
  229.  
  230. /*
  231.  * The IDs of various hardware clocks:
  232.  */
  233. #define CLOCK_SGI_CYCLE            10
  234. #define MAX_CLOCKS            16
  235. #define CLOCKS_MASK            (CLOCK_REALTIME | CLOCK_MONOTONIC)
  236. #define CLOCKS_MONO            CLOCK_MONOTONIC
  237.  
  238. /*
  239.  * The various flags for setting POSIX.1b interval timers:
  240.  */
  241. #define TIMER_ABSTIME            0x01
  242.  
  243. #endif
  244.